/**
 * (C) 2001-2024，www.bosssoft.com.cn
 * @Author: YuXingZh
 * @Date: Created in 19:45 2024-05-29
 * @Description: 返回请求类
 * 用于处理请求响应的实用工具类。
 */
package com.bosssoft.common.response;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.http.HttpStatus;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: YuXingZh
 * @Date: 创建于 2024-05-29 19:45:00
 * @Description: 用于处理请求响应的实用工具类。
 */
public class Request extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /**
     * 设置请求的数据。
     *
     * @param data 要设置的数据。
     * @return 当前的 RequestUtils 实例。
     */
    public Request setData(Object data) {
        put("data",data);
        return this;
    }

    /**
     * 使用 fastjson 将数据反序列化为指定类型。
     *
     * @param typeReference 数据类型的 TypeReference。
     * @param <T>           数据的泛型类型。
     * @return 反序列化后的数据。
     */
    public <T> T getData(TypeReference<T> typeReference) {
        Object data = get("data");	//默认是map
        String jsonString = JSON.toJSONString(data);
        T t = JSON.parseObject(jsonString, typeReference);
        return t;
    }

    /**
     * 使用 fastjson 将与指定键关联的数据反序列化为指定类型。
     *
     * @param key            与数据关联的键。
     * @param typeReference 数据类型的 TypeReference。
     * @param <T>            数据的泛型类型。
     * @return 反序列化后的数据。
     */
    public <T> T getData(String key,TypeReference<T> typeReference) {
        Object data = get(key);	//默认是map
        String jsonString = JSON.toJSONString(data);
        T t = JSON.parseObject(jsonString, typeReference);
        return t;
    }

    /**
     * 构造函数。将响应初始化为代码为 0（成功）和消息为 "success"。
     */
    public Request() {
        put("code", 0);
        put("msg", "success");
    }

    /**
     * 处理错误响应的方法
     */
    public static Request error() {
        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常，请联系管理员");
    }
    /**
     * 处理成功响应的方法
     */
    public static Request error(String msg) {
        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    }

    /**
     * 获取响应的代码。
     *
     * @return 响应的代码。
     */
    public static Request error(int code, String msg) {
        Request request = new Request();
        request.put("code", code);
        request.put("msg", msg);
        return request;
    }

    public static Request ok(String msg) {
        Request request = new Request();
        request.put("msg", msg);
        return request;
    }

    public static Request ok(Map<String, Object> map) {
        Request request = new Request();
        request.putAll(map);
        return request;
    }

    public static Request ok() {
        return new Request();
    }

    @Override
    public Request put(String key, Object value) {
        super.put(key, value);
        return this;
    }

    public Integer getCode() {

        return (Integer) this.get("code");
    }

}
